<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <meta name="viewport" content="width=device-width, initial-scale=1.0">
  <title>查找函数的作用域(The Find function scope)</title>
  <!-- 
  在JavaScript中，函数的作用域（scope）是指变量的可访问范围。函数的作用域决定了在何处可以访问和使用变量。以下是关于JavaScript中函数作用域的总结说明：
  一、作用域的类型
  1. 全局作用域（Global Scope）：
    - 在任何函数之外声明的变量具有全局作用域。这些变量可以在整个脚本中访问。
    - 在浏览器中，全局作用域的变量会成为  `window`  对象的属性。
    var globalVar = "我是全局变量";

    function test() {
      console.log(globalVar); // 可以访问
    }

    test(); // 输出: 我是全局变量
  2. 函数作用域（Function Scope）：
    - 在函数内部声明的变量只能在该函数内部访问。
    - 使用  `var`  声明的变量具有函数作用域，而使用  `let`  和  `const`  声明的变量在块级作用域内有效。
    function test() {
      var localVar = "我是局部变量";
      console.log(localVar); // 可以访问
    }

    test(); // 输出: 我是局部变量
    console.log(localVar); // 报错: localVar is not defined
  3. 块级作用域（Block Scope）：
    - 使用  `let`  和  `const`  声明的变量具有块级作用域，仅在最近的块（如  `if`  语句、 `for`  循环等）中有效。
    if (true) {
      let blockVar = "我是块级变量";
      console.log(blockVar); // 可以访问
    }

    console.log(blockVar); // 报错: blockVar is not defined

  二、作用域链（Scope Chain）
  - 当访问变量时，JavaScript会从当前作用域开始查找，如果找不到，会向上查找父作用域，直到找到该变量或达到全局作用域。
  - 这种查找机制称为作用域链。
  var globalVar = "全局变量";

  function outerFunction() {
    var outerVar = "外部变量";
    function innerFunction() {
      var innerVar = "内部变量";
      console.log(innerVar); // 可以访问内部变量
      console.log(outerVar); // 可以访问外部变量
      console.log(globalVar); // 可以访问全局变量
    }

    innerFunction();
  }

  outerFunction();

  三、闭包（Closure）
  - 闭包是指一个函数可以访问其外部作用域的变量，即使外部函数已经返回。
  - 闭包在某些情况下可以用于创建私有变量。
  function makeCounter() {
      let count = 0; // 私有变量
      return function() {
          count += 1;
          return count;
      };
  }

  const counter = makeCounter();
  console.log(counter()); // 输出: 1
  console.log(counter()); // 输出: 2

  四、总结
  - JavaScript中的作用域决定了变量的可访问性，主要分为全局作用域、函数作用域和块级作用域。
  - 作用域链用于查找变量，确保在适当的范围内访问。
  - 闭包允许函数访问其外部作用域的变量，即使外部函数已经执行完毕。
   -->
</head>
<body>

  <script>
    // 全局作用域
    var globalVar = "全局变量";

    // 函数作用域
    function outerFunction() {
      var outerVar = "外部变量";

      // 块级作用域
      {
        let blockVar = "我是块级变量";
        console.log(blockVar); // 可以访问
      }

      console.log(blockVar); // 报错: blockVar is not defined
    }

    console.log(blockVar); // 报错: blockVar is not defined
  </script>
  
</body>
</html>